GitHub CI 配置编写指南
GitHub Actions 是 GitHub 提供的持续集成和持续部署 (CI/CD) 服务,通过编写工作流配置文件 (.github/workflows/*.yml) 来自动化软件开发流程。本指南将详细介绍如何编写 GitHub Actions 的工作流配置文件。
基本概念
GitHub Actions 工作流是一个可配置的自动化过程,由 YAML 格式的配置文件定义。这些文件必须保存在仓库的 .github/workflows 目录中,扩展名为 .yml 或 .yaml。一个仓库可以包含多个工作流文件,每个文件定义不同的自动化流程。3 4
工作流可以在仓库中的事件触发时运行,也可以手动触发或按照预定的时间表运行。每个工作流由一个或多个作业组成,作业可以并行或顺序执行。4
工作流文件结构
一个典型的 GitHub Actions 工作流文件结构如下:
name: CI Workflow
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
这个简单的工作流在推送到 main 分支或创建针对 main 分支的 pull request 时触发,在 Ubuntu 最新版本上运行一系列 步骤,包括检出代码、设置 Node.js 环境、安装依赖和运行测试。1 2
工作流组件详解
1. name(工作流名称)
可选字段,用于在 GitHub 仓库的 Actions 页面上显示工作流的名称:
name: Build and Test
如果省略此字段,GitHub 将使用工作流文件的相对路径作为名称。1
2. on(触发器)
指定触发工作流的事件:
# 简单配置
on: push
# 多个事件触发
on: [push, pull_request]
# 详细配置
on:
# 推送到特定分支时触发
push:
branches: [ main, develop ]
paths-ignore: [ 'docs/**', '**.md' ]
# 创建 PR 时触发
pull_request:
branches: [ main ]
# 手动触发
workflow_dispatch:
inputs:
environment:
description: '部署环境'
required: true
default: 'staging'
# 定时触发
schedule:
- cron: '0 0 * * *' # 每天午夜运行
GitHub Actions 支持多种触发事件类型,包括代码推送、pull request、定时任务、手动触发等。1 4
3. jobs(作业)
工作流由一个或多个作业组成,默认情况下作业并行运行:
jobs:
build:
name: Build Application
runs-on: ubuntu-latest
steps:
# 构建步骤...
test:
name: Run Tests
runs-on: windows-latest
steps:
# 测试步骤...
每个作业必须有一个 ID(如上例中的 build 和 test),并且可以包含以下属性:
name:作业的显示名称runs-on:运行作业的环境(如 ubuntu-latest, windows-latest, macos-latest)needs:指定依赖的其他作业,用于创建顺序执行的作业if:条件表达式,决定是否执行此作业steps:定义作业中的步骤序列strategy:定义构建矩阵,用于在多种配置下运行作业environment:指定部署环境
4. steps(步骤)
步骤是作业中执行的任务序列,可以运行命令、设置环境、使用 Actions 等:
steps:
# 检出代码
- name: Checkout code
uses: actions/checkout@v3
# 设置 Java 环境
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 运行命令
- name: Build with Maven
run: mvn -B package --file pom.xml
# 使用环境变量
- name: Deploy to staging
run: ./deploy.sh
env:
SERVER_URL: ${{ secrets.STAGING_URL }}
API_TOKEN: ${{ secrets.API_TOKEN }}
每个步骤可以包含以下主要属性:
name:步骤的显示名称uses:指定要使用的 Actionrun:运行的命令行命令with:Action 的输入参数env:设置步骤的环境变量if:条件表达式,决定是否执行此步骤continue-on-error:指定步骤失败时是否继续执行后续步骤
5. strategy(策略)
使用策略可以创建构建矩阵,在多种配置下运行同一作业:
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node-version: [14.x, 16.x, 18.x]
include:
- os: ubuntu-latest
node-version: 18.x
npm-cache: true
exclude:
- os: windows-latest
node-version: 14.x
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
上面的配置会创建一个 3×3 的矩阵,在三种操作系统上分别测试三个 Node.js 版本,同时添加了一个特殊配置并排除了一个组合。1